package com.offcn.sellergood.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.offcn.entity.PageResult;
import com.offcn.sellergood.dao.*;
import com.offcn.sellergood.entity.GoodsEntity;
import com.offcn.sellergood.pojo.Goods;
import com.offcn.sellergood.pojo.GoodsDesc;
import com.offcn.sellergood.pojo.Item;
import com.offcn.sellergood.pojo.ItemCat;
import com.offcn.sellergood.service.GoodsService;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.yaml.snakeyaml.events.Event;
import springfox.documentation.spring.web.json.Json;

import java.util.Date;
import java.util.List;
import java.util.Map;

/****
 * @Author:ujiuye
 * @Description:Goods业务层接口实现类
 * @Date 2021/2/1 14:19
 *****/
@Service
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper,Goods> implements GoodsService {

    @Autowired
    private GoodsMapper goodsMapper;

    @Autowired
    private GoodsDescMapper goodsDescMapper;

    @Autowired
    private ItemCatMapper itemCatMapper;

    @Autowired
    private BrandMapper brandMapper;

    @Autowired
    private ItemMapper itemMapper;
    /**
     * @param: GoodsEntity goodsEntity
     * @return: null
     * @description: 添加商品的基本信息、描述、规格
     */
    @Override
    public void insert(GoodsEntity goodsEntity) {
        /**
         * Goods
         * (category1Id,category2Id,category3Id,typeTemplateId) 商品分类(一级类目，二级类目，三级类目)
         * (goodsName,brandId,caption,price)  商品名称(spu名(华为手机)) 品牌(id形式) 副标题(打折促销售中) 价格(3020.00)
         * (is_enable_spec)  是否启用规格
         *
         * tbGoodsDesc
         * (introduction,package_list,sale_service)      商品介绍() 包装列表(usb,充电线，说明书) 售后服务(1年包退)
         * (item_images)                                 商品图片(数组,json格式，有url)
         * (specification_items,custom_attribute_items)   扩展属性(规格结果集，所有规格，包含isSelected、自定义属性)
         *
         * itemList
         * (price,num,is_default)   价格、库存、默认
         */

        /**
         * @description: 第一步：将从页面获取的商品的基本信息用Goods保存起来
         */
        Goods goods = goodsEntity.getTbGoods();
        goods.setAuditStatus("0"); // 设置未审核状态audit_status
        this.save(goods);
        /**
         * @description: 第二步：将从页面获取的 商品的描述等相关 信息用GoodsDesc保存起来
         * 通过tb_goods的主键id = tb_goods_desc表中的goods_id主键，获取goods的id,并将获取的goodsId存入
         */
        Long goodsId = goods.getId();
        GoodsDesc goodsDesc = goodsEntity.getTbGoodsDesc();
        goodsDesc.setGoodsId(goodsId);
        goodsDescMapper.insert(goodsDesc);
        /**
         * @description: 第三步：
         * 如果tbGoods.getIsEnableSpec()是否启用规格 为1，表示有item数据
         * 将tb_Goods表中的goodsName 与  tb_goods_desc表中的custom_attribute_items相匹配
         */
        if (goods.getIsEnableSpec().equals("1")){
            List<Item> itemList = goodsEntity.getItemList();
            if(!CollectionUtils.isEmpty(itemList) && itemList.size()>0){
                for (Item item : itemList) {
                    // goodsName+spec
                    String goodsName = goods.getGoodsName();  // tb_goods中的goodsName
                    Map<String, String> specMap = JSON.parseObject(item.getSpec(), Map.class); //tb_item表中spec
                    for (String key : specMap.keySet()) {
                        goodsName+=key+"_"+specMap.get(key)+"";
                    }
                    item.setTitle(goodsName);  //tb_item表中的item
                    // 通过 tbgoods中 category_3 的值获取 对应 categoryName
                    ItemCat itemCat = itemCatMapper.selectById(goods.getCategory3Id());
                    String categoryName = itemCat.getName();
                    item.setCategory(categoryName);
                    item.setCategoryId(goods.getCategory3Id());
                    item.setStatus("0");             // 设置未审核状态
                    item.setCreateTime(new Date()); // 设置创建时间
                    item.setUpdateTime(new Date()); // 设置更新时间
                    item.setGoodsId(goodsId);       // 设置goodId
                    item.setSellerId(goods.getSellerId()); // sellerId
                    //image 获取 tbGoodsDesc 中第一张图片
                    List<Map> imageList = JSON.parseArray(goodsDesc.getItemImages(), Map.class);
                    if (!CollectionUtils.isEmpty(imageList)) {
                        String url = (String)imageList.get(0).get("url");
                        item.setImage(url);
                    }
                    String brandName = brandMapper.selectById(goods.getBrandId()).getName(); // 品牌名
                    item.setBarcode(brandName);
                    itemMapper.insert(item);
                }
            }
        }else {
            Item item = new Item();
            String goodsName = goods.getGoodsName();  // tb_goods中的goodsName
            item.setTitle(goodsName); //tb_item表中的item
            // 通过 tbgoods中 category_3 的值获取 对应 categoryName
            ItemCat itemCat = itemCatMapper.selectById(goods.getCategory3Id());
            String categoryName = itemCat.getName();
            item.setCategory(categoryName);
            item.setCategoryId(goods.getCategory3Id());
            item.setStatus("0");             // 设置未审核状态
            item.setCreateTime(new Date()); // 设置创建时间
            item.setUpdateTime(new Date()); // 设置更新时间
            item.setGoodsId(goodsId);       // 设置goodId
            item.setSellerId(goods.getSellerId()); // sellerId
            List<Map> imageList = JSON.parseArray(goodsDesc.getItemImages(), Map.class);  //image 获取 tbGoodsDesc 中第一张图片
            if (!CollectionUtils.isEmpty(imageList)) {
                String url = (String)imageList.get(0).get("url");
                item.setImage(url);
            }
            String brandName = brandMapper.selectById(goods.getBrandId()).getName(); // 品牌名
            item.setBarcode(brandName);
            itemMapper.insert(item);
        }
    }

    /**
     * @param: Long id
     * @return: GoodsEntity(tbGoods,tbGoodsDesc,itemList)
     * @description: 根据Id获取商品信息
     * 先根据id获取tbGoods,判断该商品是否是删除状态，如果是，则就不会有tbGoodsDesc
     * 根据id获取tbGoodsDesc、itemList，是分表操作，不能使用this,使用mapper
     */
    @Override
    public GoodsEntity findById(Long id) {
        Goods goods = this.getById(id);
        String isDelete = goods.getIsDelete();
        if(isDelete != null && isDelete.equals("1")){
            throw new RuntimeException("当前商品已被删除");
        }
        GoodsDesc goodsDesc = goodsDescMapper.selectById(id);
        QueryWrapper<Item> wrapper = new QueryWrapper<>();
        wrapper.eq("goods_id",id);
        List<Item> itemList = itemMapper.selectList(wrapper);
        return new GoodsEntity(goods, goodsDesc, itemList);
    }

    /**
     * @param: Long goodsId
     * @return: null
     * @description: 商品审核通过自动上架
     * @analyze: 商品新增后，审核状态为0（未审核），默认为下架状态。
     *           审核商品，需要校验是否是被删除的商品，如果未删除则修改审核状态为1，并自动上架
     */
    @Override
    public void audit(Long goodsId) {
        Goods goods = this.getById(goodsId);
        String isDelete = goods.getIsDelete();
        if(isDelete != null && isDelete.equals("1")){
            throw new RuntimeException("当前商品已被删除");
        }
        goods.setAuditStatus("1"); // 表示商品已经审核 tb_goods的audit_status字段
        goods.setIsMarketable("1"); // 审核通过后自动上架 tb_goods的is_marketable字段
        this.updateById(goods);
    }

    /**
     * @param: Long goodsId
     * @return: null if
     * @description: 商品下架
     * @analyze: 根据商品的id获取该商品，并将其isMarketable修改为"0".
     */
    @Override
    public void pull(Long goodsId) {
        Goods goods = this.getById(goodsId);
        String isDelete = goods.getIsDelete();
        if(isDelete != null && isDelete.equals("1")){
            throw new RuntimeException("当前商品已被删除");
        }
        goods.setIsMarketable("0");
        this.updateById(goods);
    }

    /**
     * @param: Long[] goodsIds
     * @return: int
     * @description: 商品批量下架
     * @analyze: 前提：audit_status=1&&isDelete是空且的情况下
     */
    @Override
    public int pullAll(Long[] goodsIds) {
        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        // 构建isDelete不为空且不为1的条件  没被删除
        wrapper.eq("audit_status","1"); // 当前被审核通过
        wrapper.isNull("is_delete");
        //wrapper.ne("is_delete","1");
        // 构建audit_status
        wrapper.in("id",goodsIds);
        Goods goods = new Goods();
        goods.setIsMarketable("0");  // 下架状态
        return goodsMapper.update(goods,wrapper);
    }

    /**
     * @param: Long goodsId
     * @return: null
     * @description: 商品上架
     * @analyze: 根据商品的id获取该商品，并将其isMarketable修改为"1".
     */
    @Override
    public void push(Long goodsId) {
        Goods goods = this.getById(goodsId);
        String isDelete = goods.getIsDelete();
        if(isDelete != null && isDelete.equals("1")){
            throw new RuntimeException("当前商品已被删除");
        }
        goods.setIsMarketable("1");
        this.updateById(goods);
    }

    /**
     * @param: Long[] goodsIds
     * @return: int
     * @description: 商品批量上架
     * @analyze: 前提：audit_status=1&&isDelete是空且的情况下
     */
    @Override
    public int pushAll(Long[] goodsIds) {
        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        // 构建isDelete不为空且不为1的条件  没被删除
        wrapper.eq("audit_status","1"); // 当前被审核通过
        wrapper.isNull("is_delete");
        //wrapper.ne("is_delete","1");
        // 构建audit_status
        wrapper.in("id",goodsIds);
        Goods goods = new Goods();
        goods.setIsMarketable("1");  // 上架状态
        return goodsMapper.update(goods,wrapper);
    }

    /**
     * @param: Long id
     * @return: null
     * @description: 商品删除
     * @analyze: 下架后才可以删除
     */
    @Override
    public void delete(Long id) {
        Goods goods = this.getById(id);
        // 判断是否下架 ，下架之后才可以删除
        if (!goods.getIsMarketable().equals("0")) {
            throw new RuntimeException("只有下架的商品才可以被删除");
        }
        // 逻辑删除
        goods.setIsDelete("1");
        // 将审核状态修改为 0
        goods.setAuditStatus("0");
        this.updateById(goods);
    }
}
